--座位逻辑
--管理玩家所有数据（玩家信息，牌数据，游戏信息等）
--

local tabletool = require "tabletool"
local filelog = require "filelog"
local timer = require "timer"
local timetool = require "timetool"

require "bjlenum"

local SeatLogic = {}
local service = nil


function SeatLogic.init(caller)
	service = caller
end

-----------------------------

--
--初始化座位数据
--
function SeatLogic.init_data(seat, index)
    seat.rid = 0
	seat.index = index
	seat.state = EBJLSeatState.SEAT_STATE_NO_PLAYER

    --玩家信息
	seat.playerinfo = {
		rolename = "",      --名字
        level = 0,          --等级
		logo = "",          --头像
		sex = 0,            --性别
        coin = 0,           --金币
        lock_coin = 0,      --银行金币
        diamond = 0,        --钻石
        lock_diamond = 0,   --保险箱钻石
		ip_addr = "",       --ip地址
        recommrid =  0,     --推荐人rid
		agencyrid =  0,     --代理rid
		agencylevel =  0,   --代理等级，0表示不是代理
		gps_addr = "",      --地理位置
        intro = "",         --个人信息
        upvoted_num = 0,    --被赞数
        downvoted_num = 0,  --被踩数
        logoframe = 0,      --头像框
	}
    
    seat.is_banker = false          --是否是庄家
	seat.is_robot = false           --是否为机器人
    seat.is_disconnected = false    --玩家是否断线
	seat.offline = 0                --是否离线 1离线，0在线
    seat.had_ready = false          --是否已准备，只有第一次进桌时才需要准备

    --战绩信息
	seat.win_num = 0                --记录胜利次数
	seat.fail_num = 0               --记录玩家失败次数
	seat.draw_num = 0               --记录玩家平局次数 

    seat.ready_timer_id = -1        --准备计时器
    seat.ready_timeout_time = 0     --准备超时时间
    seat.disconnect_timer_id = -1   --断线计时器

    --游戏相关
    seat.curr_score = 0             --当前得分
    seat.balance_score = 0          --结算分
	seat.total_score = 0            --总得分,累积输赢
    seat.cur_total_bet = 0          --当前总下注金额
    seat.last_total_bet = 0         --上次总下注金额
    seat.cur_base_score = 0         --当前选择底注
    seat.cur_bet_list = nil         --当前下注列表
    seat.last_bet_list = nil        --上次下注列表
    seat.last_win_score = 0         --上局输赢数
    seat.is_auto_last_bet = false   --是否自动续压（重复上次压注）
    seat.remain_banker_round = 0    --剩余做庄局数
    seat.hit_fruit_list = {}        --押中水果列表
    seat.cur_bet_cnt = 0            --当前下注次数
    seat.last_bet_cnt = 0           --上局下注次数
    seat.goodluck_prize_coin = 0    --鸿运当头奖励金币
    seat.play_game_num = 0          --玩游戏次数
    seat.cur_bet_cnt_list = {}      --当前下注次数列表
    seat.last_bet_cnt_list = nil    --上局下注次数列表
    seat.cur_betcnt_inc_list = {}   --当前下注次数变化列表
    seat.cur_upbanker_money = 0     --当前上庄金额
    seat.cur_downbanker_money = 0   --当前下庄金额
    seat.late_total_bet = 0         --最近总下注
    seat.history_record_list = {}   --历史记录列表（下注数，得分）

	return true
end

--
--判断座位是否有人
--
function SeatLogic.is_empty(seat)
	return (seat.state == EBJLSeatState.SEAT_STATE_NO_PLAYER or seat.rid <= 0)
end

--
--清空角色相关数据
--
function SeatLogic.clear(seat)
	seat.rid = 0
	seat.state = EBJLSeatState.SEAT_STATE_UNKNOW  --更改坐位玩家状态，未知
	seat.playerinfo = {}
end

----------------------------------------

--
--清空座位数据
--
function SeatLogic.clear_seat(seat)
	seat.rid = 0
	seat.state = EBJLSeatState.SEAT_STATE_NO_PLAYER

	seat.playerinfo.rolename = ""
	seat.playerinfo.logo=""
	seat.playerinfo.sex = 0
    seat.playerinfo.coin = 0                   --玩家金币
	seat.playerinfo.lock_coin = 0              --银行金币
    seat.playerinfo.diamond = 0                --玩家的钻石
    seat.playerinfo.ip_addr = ""
    seat.playerinfo.lock_diamond = 0
    seat.playerinfo.recommrid =  0     --推荐人rid
	seat.playerinfo.agencyrid =  0     --代理rid
	seat.playerinfo.agencylevel =  0   --代理等级，0表示不是代理
    seat.playerinfo.level = 0
    seat.playerinfo.intro = ""
    seat.playerinfo.upvoted_num = 0    --被赞数
    seat.playerinfo.downvoted_num = 0  --被踩数
    seat.playerinfo.logoframe = 0      --头像框

    seat.is_banker = false
	seat.is_robot = false
    seat.is_disconnected = false    --玩家是否断线
    seat.offline = 0                --是否离线 1离线，0在线
    seat.had_ready = false          --是否已准备
	
    --战绩信息
	seat.win_num = 0         --记录胜利次数
	seat.fail_num = 0        --记录玩家失败次数
	seat.draw_num = 0        --记录玩家平局次数 

     --关闭准备计时器
    if seat.ready_timer_id and seat.ready_timer_id > 0 then
		timer.cleartimer(seat.ready_timer_id)
	end 
    seat.ready_timer_id = -1   
    seat.ready_timeout_time = 0         --准备超时时间

    --关闭断线计时器
    if seat.disconnect_timer_id > 0 then
        timer.cleartimer(seat.disconnect_timer_id)
    end
    seat.disconnect_timer_id = -1   

    --游戏相关
    seat.curr_score = 0             --当前得分
    seat.balance_score = 0          --结算分
	seat.total_score = 0            --总得分
    seat.cur_total_bet = 0          --当前总下注金额
    seat.last_total_bet = 0         --上次总下注金额
    seat.cur_base_score = 0         --当前选择底注
    seat.cur_bet_list = nil         --当前下注列表
    seat.last_bet_list = nil        --上次下注列表
    seat.last_win_score = 0         --上局输赢数
    seat.is_auto_last_bet = false   --是否自动续压（重复上次压注）
    seat.remain_banker_round = 0    --剩余做庄局数
    seat.hit_fruit_list = {}        --押中水果列表
    seat.cur_bet_cnt = 0            --当前下注次数
    seat.last_bet_cnt = 0           --上局下注次数
    seat.goodluck_prize_coin = 0    --鸿运当头奖励金币
    seat.play_game_num = 0          --玩游戏次数
    seat.is_delayleave = nil        --是否本局结束后离桌
    seat.cur_bet_cnt_list = {}     --当前下注次数列表
    seat.last_bet_cnt_list = nil    --上局下注次数列表
    seat.cur_betcnt_inc_list = {}  --当前下注次数变化列表
    seat.cur_upbanker_money = 0     --当前上庄金额
    seat.cur_downbanker_money = 0   --当前下庄金额
    seat.late_total_bet = 0         --最近总下注
    seat.history_record_list = {}   --历史记录列表（下注数，得分）
end

--[Comment]
-- 一局开始后，初始化座位
--
function SeatLogic.onegamestart_initseat(seat)
	seat.state = EBJLSeatState.SEAT_STATE_WAIT_BET  --等待下注

	seat.curr_score = 0         --当前得分
    seat.balance_score = 0      --结算分
    seat.cur_total_bet = 0      --当前总下注金额
    seat.cur_bet_list = nil     --当前下注列表
    seat.hit_fruit_list = {}    --押中水果列表
    seat.cur_bet_cnt = 0        --当前下注次数
    seat.goodluck_prize_coin = 0--鸿运当头奖励金币
    seat.sub_fee_score = 0      --扣除的服务费

    seat.cur_bet_cnt_list = {}     --当前下注次数列表
    seat.cur_betcnt_inc_list = {}  --当前下注次数变化列表

     --关闭准备计时器
    if seat.ready_timer_id and seat.ready_timer_id > 0 then
		timer.cleartimer(seat.ready_timer_id)
	end 
    seat.ready_timer_id = -1  
    seat.ready_timeout_time = 0         --准备超时时间
    seat.is_delayleave = nil            --是否本局结束后离桌
    if seat.last_total_bet > 0 then
        seat.play_game_num = seat.play_game_num + 1
    end
    
end

--[Comment]
-- 一局结束后，初始化座位
--
function SeatLogic.onegameend_initseat(seat)
	seat.state = EBJLSeatState.SEAT_STATE_WAIT_START    --等待开局

    seat.last_win_score = seat.balance_score--上局输赢
    seat.last_bet_list = seat.cur_bet_list  --上次下注列表
    seat.last_total_bet = seat.cur_total_bet--上次总下注金额
    seat.last_bet_cnt = seat.cur_bet_cnt    --上局下注次数

    seat.last_bet_cnt_list = seat.cur_bet_cnt_list --上局下注次数列表
    seat.cur_bet_cnt_list = nil             --当前下注次数列表
    seat.cur_betcnt_inc_list = nil          --当前下注次数变化列表

    seat.curr_score = 0                     --当前得分
    seat.cur_total_bet = 0                  --当前总下注金额
    seat.cur_bet_list = nil                 --当前下注列表
    seat.hit_fruit_list = nil               --押中水果列表
    seat.cur_bet_cnt = 0                    --当前下注次数
    seat.goodluck_prize_coin = 0            --鸿运当头奖励金币
    seat.sub_fee_score = 0                  --扣除的服务费

    --10局未下注，踢出房间
    if not seat.is_robot and not seat.is_banker and #(seat.history_record_list) >= 10 
    and seat.late_total_bet == 0 and seat.draw_num >= 10 then
        local isok = true
        local len = #(seat.history_record_list)
        for i = len,len-9,-1 do
            local item = seat.history_record_list[i]
            if item.curr_score ~= 0 then
                isok = false
                break
            end
        end
        if isok then
            seat.is_delayleave = true
        end
    end

    --减少做庄局数
    if seat.is_banker then
        seat.remain_banker_round = seat.remain_banker_round - 1
        if seat.remain_banker_round <= 0 then
            seat.remain_banker_round = 0
        end
    end
end

--处理玩家离线
--deal_player_offline
--
function SeatLogic.deal_player_offline(seat)
	if not seat then return end
	local leavetablemsg = {
			rid = seat.rid,
            seat_index = seat.index,
	}

    local tablelogic = service:get_logicbyname("tablelogic")
	tablelogic.sendmsg_to_alltableplayer(service.table_data, "disconnectN", leavetablemsg)
end

return SeatLogic